/*
   Defines base attributes of a bookmark object

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
   If a copy of the MPL was not distributed with this file, You can obtain one at
   http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.domain;

import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;

import com.freerdp.freerdpcore.application.GlobalApp;

import java.util.Locale;

public class BookmarkBase implements Parcelable, Cloneable {
	public static final int TYPE_INVALID = -1;
	public static final int TYPE_MANUAL = 1;
	public static final int TYPE_QUICKCONNECT = 2;
	public static final int TYPE_PLACEHOLDER = 3;
	public static final int TYPE_CUSTOM_BASE = 1000;
	public static final Parcelable.Creator<BookmarkBase> CREATOR =
			new Parcelable.Creator<BookmarkBase>() {
				public BookmarkBase createFromParcel(Parcel in) {
					return new BookmarkBase(in);
				}

				@Override
				public BookmarkBase[] newArray(int size) {
					return new BookmarkBase[size];
				}
			};
	protected int type;
	private long id;
	private String label;
	private String username;
	private String password;
	private String domain;
	private ScreenSettings screenSettings;
	private PerformanceFlags performanceFlags;
	private AdvancedSettings advancedSettings;
	private DebugSettings debugSettings;

	public BookmarkBase(Parcel parcel) {
		type = parcel.readInt();
		id = parcel.readLong();
		label = parcel.readString();
		username = parcel.readString();
		password = parcel.readString();
		domain = parcel.readString();

		screenSettings = parcel.readParcelable(ScreenSettings.class.getClassLoader());
		performanceFlags = parcel.readParcelable(PerformanceFlags.class.getClassLoader());
		advancedSettings = parcel.readParcelable(AdvancedSettings.class.getClassLoader());
		debugSettings = parcel.readParcelable(DebugSettings.class.getClassLoader());
	}

	public BookmarkBase() {
		init();
	}

	private void init() {
		type = TYPE_INVALID;
		id = -1;
		label = "";
		username = "";
		password = "";
		domain = "";

		screenSettings = new ScreenSettings();
		performanceFlags = new PerformanceFlags();
		advancedSettings = new AdvancedSettings();
		debugSettings = new DebugSettings();
	}

	@SuppressWarnings("unchecked")
	public <T extends BookmarkBase> T get() {
		return (T) this;
	}

	public int getType() {
		return type;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getLabel() {
		return label;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getDomain() {
		return domain;
	}

	public void setDomain(String domain) {
		this.domain = domain;
	}

	public ScreenSettings getScreenSettings() {
		return screenSettings;
	}

	public void setScreenSettings(ScreenSettings screenSettings) {
		this.screenSettings = screenSettings;
	}

	public PerformanceFlags getPerformanceFlags() {
		return performanceFlags;
	}

	public void setPerformanceFlags(PerformanceFlags performanceFlags) {
		this.performanceFlags = performanceFlags;
	}

	public AdvancedSettings getAdvancedSettings() {
		return advancedSettings;
	}

	public void setAdvancedSettings(AdvancedSettings advancedSettings) {
		this.advancedSettings = advancedSettings;
	}

	public DebugSettings getDebugSettings() {
		return debugSettings;
	}

	public void setDebugSettings(DebugSettings debugSettings) {
		this.debugSettings = debugSettings;
	}

	public ScreenSettings getActiveScreenSettings() {
		return (GlobalApp.ConnectedTo3G && advancedSettings.getEnable3GSettings())
				? advancedSettings.getScreen3G()
				: screenSettings;
	}

	public PerformanceFlags getActivePerformanceFlags() {
		return (GlobalApp.ConnectedTo3G && advancedSettings.getEnable3GSettings())
				? advancedSettings.getPerformance3G()
				: performanceFlags;
	}

	@Override
	public int describeContents() {
		return 0;
	}

	@Override
	public void writeToParcel(Parcel out, int flags) {
		out.writeInt(type);
		out.writeLong(id);
		out.writeString(label);
		out.writeString(username);
		out.writeString(password);
		out.writeString(domain);

		out.writeParcelable(screenSettings, flags);
		out.writeParcelable(performanceFlags, flags);
		out.writeParcelable(advancedSettings, flags);
		out.writeParcelable(debugSettings, flags);
	}

	// write to shared preferences
	public void writeToSharedPreferences(SharedPreferences sharedPrefs) {

		Locale locale = Locale.ENGLISH;

		SharedPreferences.Editor editor = sharedPrefs.edit();
		editor.clear();
		editor.putString("bookmark.label", label);
		editor.putString("bookmark.username", username);
		editor.putString("bookmark.password", password);
		editor.putString("bookmark.domain", domain);

		editor.putInt("bookmark.colors", screenSettings.getColors());
		editor.putString("bookmark.resolution",
				screenSettings.getResolutionString().toLowerCase(locale));
		editor.putInt("bookmark.width", screenSettings.getWidth());
		editor.putInt("bookmark.height", screenSettings.getHeight());

		editor.putBoolean("bookmark.perf_remotefx", performanceFlags.getRemoteFX());
		editor.putBoolean("bookmark.perf_gfx", performanceFlags.getGfx());
		editor.putBoolean("bookmark.perf_gfx_h264", performanceFlags.getH264());
		editor.putBoolean("bookmark.perf_wallpaper", performanceFlags.getWallpaper());
		editor.putBoolean("bookmark.perf_font_smoothing", performanceFlags.getFontSmoothing());
		editor.putBoolean("bookmark.perf_desktop_composition",
				performanceFlags.getDesktopComposition());
		editor.putBoolean("bookmark.perf_window_dragging", performanceFlags.getFullWindowDrag());
		editor.putBoolean("bookmark.perf_menu_animation", performanceFlags.getMenuAnimations());
		editor.putBoolean("bookmark.perf_themes", performanceFlags.getTheming());

		editor.putBoolean("bookmark.enable_3g_settings", advancedSettings.getEnable3GSettings());

		editor.putInt("bookmark.colors_3g", advancedSettings.getScreen3G().getColors());
		editor.putString("bookmark.resolution_3g",
				advancedSettings.getScreen3G().getResolutionString().toLowerCase(locale));
		editor.putInt("bookmark.width_3g", advancedSettings.getScreen3G().getWidth());
		editor.putInt("bookmark.height_3g", advancedSettings.getScreen3G().getHeight());

		editor.putBoolean("bookmark.perf_remotefx_3g",
				advancedSettings.getPerformance3G().getRemoteFX());
		editor.putBoolean("bookmark.perf_gfx_3g", advancedSettings.getPerformance3G().getGfx());
		editor.putBoolean("bookmark.perf_gfx_h264_3g",
				advancedSettings.getPerformance3G().getH264());
		editor.putBoolean("bookmark.perf_wallpaper_3g",
				advancedSettings.getPerformance3G().getWallpaper());
		editor.putBoolean("bookmark.perf_font_smoothing_3g",
				advancedSettings.getPerformance3G().getFontSmoothing());
		editor.putBoolean("bookmark.perf_desktop_composition_3g",
				advancedSettings.getPerformance3G().getDesktopComposition());
		editor.putBoolean("bookmark.perf_window_dragging_3g",
				advancedSettings.getPerformance3G().getFullWindowDrag());
		editor.putBoolean("bookmark.perf_menu_animation_3g",
				advancedSettings.getPerformance3G().getMenuAnimations());
		editor.putBoolean("bookmark.perf_themes_3g",
				advancedSettings.getPerformance3G().getTheming());

		editor.putBoolean("bookmark.redirect_sdcard", advancedSettings.getRedirectSDCard());
		editor.putInt("bookmark.redirect_sound", advancedSettings.getRedirectSound());
		editor.putBoolean("bookmark.redirect_microphone", advancedSettings.getRedirectMicrophone());
		editor.putInt("bookmark.security", advancedSettings.getSecurity());
		editor.putString("bookmark.remote_program", advancedSettings.getRemoteProgram());
		editor.putString("bookmark.work_dir", advancedSettings.getWorkDir());
		editor.putBoolean("bookmark.console_mode", advancedSettings.getConsoleMode());

		editor.putBoolean("bookmark.async_channel", debugSettings.getAsyncChannel());
		editor.putBoolean("bookmark.async_input", debugSettings.getAsyncInput());
		editor.putBoolean("bookmark.async_update", debugSettings.getAsyncUpdate());
		editor.putString("bookmark.debug_level", debugSettings.getDebugLevel());

		editor.apply();
	}

	// read from shared preferences
	public void readFromSharedPreferences(SharedPreferences sharedPrefs) {
		label = sharedPrefs.getString("bookmark.label", "");
		username = sharedPrefs.getString("bookmark.username", "");
		password = sharedPrefs.getString("bookmark.password", "");
		domain = sharedPrefs.getString("bookmark.domain", "");

		screenSettings.setColors(sharedPrefs.getInt("bookmark.colors", 16));
		screenSettings.setResolution(sharedPrefs.getString("bookmark.resolution", "automatic"),
				sharedPrefs.getInt("bookmark.width", 800),
				sharedPrefs.getInt("bookmark.height", 600));

		performanceFlags.setRemoteFX(sharedPrefs.getBoolean("bookmark.perf_remotefx", false));
		performanceFlags.setGfx(sharedPrefs.getBoolean("bookmark.perf_gfx", false));
		performanceFlags.setH264(sharedPrefs.getBoolean("bookmark.perf_gfx_h264", false));
		performanceFlags.setWallpaper(sharedPrefs.getBoolean("bookmark.perf_wallpaper", false));
		performanceFlags.setFontSmoothing(
				sharedPrefs.getBoolean("bookmark.perf_font_smoothing", false));
		performanceFlags.setDesktopComposition(
				sharedPrefs.getBoolean("bookmark.perf_desktop_composition", false));
		performanceFlags.setFullWindowDrag(
				sharedPrefs.getBoolean("bookmark.perf_window_dragging", false));
		performanceFlags.setMenuAnimations(
				sharedPrefs.getBoolean("bookmark.perf_menu_animation", false));
		performanceFlags.setTheming(sharedPrefs.getBoolean("bookmark.perf_themes", false));

		advancedSettings.setEnable3GSettings(
				sharedPrefs.getBoolean("bookmark.enable_3g_settings", false));

		advancedSettings.getScreen3G().setColors(sharedPrefs.getInt("bookmark.colors_3g", 16));
		advancedSettings.getScreen3G().setResolution(
				sharedPrefs.getString("bookmark.resolution_3g", "automatic"),
				sharedPrefs.getInt("bookmark.width_3g", 800),
				sharedPrefs.getInt("bookmark.height_3g", 600));

		advancedSettings.getPerformance3G().setRemoteFX(
				sharedPrefs.getBoolean("bookmark.perf_remotefx_3g", false));
		advancedSettings.getPerformance3G().setGfx(
				sharedPrefs.getBoolean("bookmark.perf_gfx_3g", false));
		advancedSettings.getPerformance3G().setH264(
				sharedPrefs.getBoolean("bookmark.perf_gfx_h264_3g", false));
		advancedSettings.getPerformance3G().setWallpaper(
				sharedPrefs.getBoolean("bookmark.perf_wallpaper_3g", false));
		advancedSettings.getPerformance3G().setFontSmoothing(
				sharedPrefs.getBoolean("bookmark.perf_font_smoothing_3g", false));
		advancedSettings.getPerformance3G().setDesktopComposition(
				sharedPrefs.getBoolean("bookmark.perf_desktop_composition_3g", false));
		advancedSettings.getPerformance3G().setFullWindowDrag(
				sharedPrefs.getBoolean("bookmark.perf_window_dragging_3g", false));
		advancedSettings.getPerformance3G().setMenuAnimations(
				sharedPrefs.getBoolean("bookmark.perf_menu_animation_3g", false));
		advancedSettings.getPerformance3G().setTheming(
				sharedPrefs.getBoolean("bookmark.perf_themes_3g", false));

		advancedSettings.setRedirectSDCard(
				sharedPrefs.getBoolean("bookmark.redirect_sdcard", false));
		advancedSettings.setRedirectSound(sharedPrefs.getInt("bookmark.redirect_sound", 0));
		advancedSettings.setRedirectMicrophone(
				sharedPrefs.getBoolean("bookmark.redirect_microphone", false));
		advancedSettings.setSecurity(sharedPrefs.getInt("bookmark.security", 0));
		advancedSettings.setRemoteProgram(sharedPrefs.getString("bookmark.remote_program", ""));
		advancedSettings.setWorkDir(sharedPrefs.getString("bookmark.work_dir", ""));
		advancedSettings.setConsoleMode(sharedPrefs.getBoolean("bookmark.console_mode", false));

		debugSettings.setAsyncChannel(sharedPrefs.getBoolean("bookmark.async_channel", true));
		debugSettings.setAsyncInput(sharedPrefs.getBoolean("bookmark.async_input", true));
		debugSettings.setAsyncUpdate(sharedPrefs.getBoolean("bookmark.async_update", true));
		debugSettings.setDebugLevel(sharedPrefs.getString("bookmark.debug_level", "INFO"));
	}

	// Cloneable
	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}

	// performance flags
	public static class PerformanceFlags implements Parcelable {
		public static final Parcelable.Creator<PerformanceFlags> CREATOR =
				new Parcelable.Creator<PerformanceFlags>() {
					public PerformanceFlags createFromParcel(Parcel in) {
						return new PerformanceFlags(in);
					}

					@Override
					public PerformanceFlags[] newArray(int size) {
						return new PerformanceFlags[size];
					}
				};
		private boolean remotefx;
		private boolean gfx;
		private boolean h264;
		private boolean wallpaper;
		private boolean theming;
		private boolean fullWindowDrag;
		private boolean menuAnimations;
		private boolean fontSmoothing;
		private boolean desktopComposition;

		public PerformanceFlags() {
			remotefx = false;
			gfx = false;
			h264 = false;
			wallpaper = false;
			theming = false;
			fullWindowDrag = false;
			menuAnimations = false;
			fontSmoothing = false;
			desktopComposition = false;
		}

		public PerformanceFlags(Parcel parcel) {
			remotefx = parcel.readInt() == 1;
			gfx = parcel.readInt() == 1;
			h264 = parcel.readInt() == 1;
			wallpaper = parcel.readInt() == 1;
			theming = parcel.readInt() == 1;
			fullWindowDrag = (parcel.readInt() == 1);
			menuAnimations = parcel.readInt() == 1;
			fontSmoothing = parcel.readInt() == 1;
			desktopComposition = parcel.readInt() == 1;
		}

		public boolean getRemoteFX() {
			return remotefx;
		}

		public void setRemoteFX(boolean remotefx) {
			this.remotefx = remotefx;
		}

		public boolean getGfx() {
			return gfx;
		}

		public void setGfx(boolean gfx) {
			this.gfx = gfx;
		}

		public boolean getH264() {
			return h264;
		}

		public void setH264(boolean h264) {
			this.h264 = h264;
		}

		public boolean getWallpaper() {
			return wallpaper;
		}

		public void setWallpaper(boolean wallpaper) {
			this.wallpaper = wallpaper;
		}

		public boolean getTheming() {
			return theming;
		}

		public void setTheming(boolean theming) {
			this.theming = theming;
		}

		public boolean getFullWindowDrag() {
			return fullWindowDrag;
		}

		public void setFullWindowDrag(boolean fullWindowDrag) {
			this.fullWindowDrag = fullWindowDrag;
		}

		public boolean getMenuAnimations() {
			return menuAnimations;
		}

		public void setMenuAnimations(boolean menuAnimations) {
			this.menuAnimations = menuAnimations;
		}

		public boolean getFontSmoothing() {
			return fontSmoothing;
		}

		public void setFontSmoothing(boolean fontSmoothing) {
			this.fontSmoothing = fontSmoothing;
		}

		public boolean getDesktopComposition() {
			return desktopComposition;
		}

		public void setDesktopComposition(boolean desktopComposition) {
			this.desktopComposition = desktopComposition;
		}

		@Override
		public int describeContents() {
			return 0;
		}

		@Override
		public void writeToParcel(Parcel out, int flags) {
			out.writeInt(remotefx ? 1 : 0);
			out.writeInt(gfx ? 1 : 0);
			out.writeInt(h264 ? 1 : 0);
			out.writeInt(wallpaper ? 1 : 0);
			out.writeInt(theming ? 1 : 0);
			out.writeInt(fullWindowDrag ? 1 : 0);
			out.writeInt(menuAnimations ? 1 : 0);
			out.writeInt(fontSmoothing ? 1 : 0);
			out.writeInt(desktopComposition ? 1 : 0);
		}
	}

	// Screen Settings class
	public static class ScreenSettings implements Parcelable {

		public static final int FITSCREEN = -2;
		public static final int AUTOMATIC = -1;
		public static final int CUSTOM = 0;
		public static final int PREDEFINED = 1;

		public static final Parcelable.Creator<ScreenSettings> CREATOR =
				new Parcelable.Creator<ScreenSettings>() {
					public ScreenSettings createFromParcel(Parcel in) {
						return new ScreenSettings(in);
					}

					@Override
					public ScreenSettings[] newArray(int size) {
						return new ScreenSettings[size];
					}
				};
		private int resolution;
		private int colors;
		private int width;
		private int height;

		public ScreenSettings() {
			init();
		}

		public ScreenSettings(Parcel parcel) {
			resolution = parcel.readInt();
			colors = parcel.readInt();
			width = parcel.readInt();
			height = parcel.readInt();
		}

		private void validate() {
			switch (colors) {
				case 32:
				case 24:
				case 16:
				case 15:
				case 8:
					break;
				default:
					colors = 32;
					break;
			}

			if ((width <= 0) || (width > 65536)) {
				width = 1024;
			}

			if ((height <= 0) || (height > 65536)) {
				height = 768;
			}

			switch (resolution) {
				case FITSCREEN:
				case AUTOMATIC:
				case CUSTOM:
				case PREDEFINED:
					break;
				default:
					resolution = AUTOMATIC;
					break;
			}
		}

		private void init() {
			resolution = AUTOMATIC;
			colors = 16;
			width = 0;
			height = 0;
		}

		public void setResolution(String resolution, int width, int height) {
			if (resolution.contains("x")) {
				String[] dimensions = resolution.split("x");
				this.width = Integer.valueOf(dimensions[0]);
				this.height = Integer.valueOf(dimensions[1]);
				this.resolution = PREDEFINED;
			} else if (resolution.equalsIgnoreCase("custom")) {
				this.width = width;
				this.height = height;
				this.resolution = CUSTOM;
			} else if (resolution.equalsIgnoreCase("fitscreen")) {
				this.width = this.height = 0;
				this.resolution = FITSCREEN;
			} else {
				this.width = this.height = 0;
				this.resolution = AUTOMATIC;
			}
		}

		public int getResolution() {
			return resolution;
		}

		public void setResolution(int resolution) {
			this.resolution = resolution;

			if (resolution == AUTOMATIC || resolution == FITSCREEN) {
				width = 0;
				height = 0;
			}
		}

		public String getResolutionString() {
			if (isPredefined())
				return (width + "x" + height);

			return (isFitScreen() ? "fitscreen" : isAutomatic() ? "automatic" : "custom");
		}

		public boolean isPredefined() {
			validate();
			return (resolution == PREDEFINED);
		}

		public boolean isAutomatic() {
			validate();
			return (resolution == AUTOMATIC);
		}

		public boolean isFitScreen() {
			validate();
			return (resolution == FITSCREEN);
		}

		public boolean isCustom() {
			validate();
			return (resolution == CUSTOM);
		}

		public int getWidth() {
			validate();
			return width;
		}

		public void setWidth(int width) {
			this.width = width;
		}

		public int getHeight() {
			validate();
			return height;
		}

		public void setHeight(int height) {
			this.height = height;
		}

		public int getColors() {
			validate();
			return colors;
		}

		public void setColors(int colors) {
			this.colors = colors;
		}

		@Override
		public int describeContents() {
			return 0;
		}

		@Override
		public void writeToParcel(Parcel out, int flags) {
			out.writeInt(resolution);
			out.writeInt(colors);
			out.writeInt(width);
			out.writeInt(height);
		}
	}

	public static class DebugSettings implements Parcelable {

		public static final Parcelable.Creator<DebugSettings> CREATOR =
				new Parcelable.Creator<DebugSettings>() {
					public DebugSettings createFromParcel(Parcel in) {
						return new DebugSettings(in);
					}

					@Override
					public DebugSettings[] newArray(int size) {
						return new DebugSettings[size];
					}
				};
		private String debug;
		private boolean asyncChannel;
		private boolean asyncTransport;
		private boolean asyncInput;
		private boolean asyncUpdate;

		public DebugSettings() {
			init();
		}

		// Session Settings
		public DebugSettings(Parcel parcel) {
			asyncChannel = parcel.readInt() == 1;
			asyncTransport = parcel.readInt() == 1;
			asyncInput = parcel.readInt() == 1;
			asyncUpdate = parcel.readInt() == 1;
			debug = parcel.readString();
		}

		private void init() {
			debug = "INFO";
			asyncChannel = true;
			asyncTransport = false;
			asyncInput = true;
			asyncUpdate = true;
		}

		private void validate() {
			final String[] levels = {"OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"};

			for (String level : levels) {
				if (level.equalsIgnoreCase(this.debug)) {
					return;
				}
			}

			this.debug = "INFO";
		}

		public String getDebugLevel() {
			validate();
			return debug;
		}

		public void setDebugLevel(String debug) {
			this.debug = debug;
		}

		public boolean getAsyncUpdate() {
			return asyncUpdate;
		}

		public void setAsyncUpdate(boolean enabled) {
			asyncUpdate = enabled;
		}

		public boolean getAsyncInput() {
			return asyncInput;
		}

		public void setAsyncInput(boolean enabled) {
			asyncInput = enabled;
		}

		public boolean getAsyncChannel() {
			return asyncChannel;
		}

		public void setAsyncChannel(boolean enabled) {
			asyncChannel = enabled;
		}

		@Override
		public int describeContents() {
			return 0;
		}

		@Override
		public void writeToParcel(Parcel out, int flags) {
			out.writeInt(asyncChannel ? 1 : 0);
			out.writeInt(asyncTransport ? 1 : 0);
			out.writeInt(asyncInput ? 1 : 0);
			out.writeInt(asyncUpdate ? 1 : 0);
			out.writeString(debug);
		}
	}

	// Session Settings
	public static class AdvancedSettings implements Parcelable {
		public static final Parcelable.Creator<AdvancedSettings> CREATOR =
				new Parcelable.Creator<AdvancedSettings>() {
					public AdvancedSettings createFromParcel(Parcel in) {
						return new AdvancedSettings(in);
					}

					@Override
					public AdvancedSettings[] newArray(int size) {
						return new AdvancedSettings[size];
					}
				};
		private boolean enable3GSettings;
		private ScreenSettings screen3G;
		private PerformanceFlags performance3G;
		private boolean redirectSDCard;
		private int redirectSound;
		private boolean redirectMicrophone;
		private int security;
		private boolean consoleMode;
		private String remoteProgram;
		private String workDir;

		public AdvancedSettings() {
			init();
		}

		public AdvancedSettings(Parcel parcel) {
			enable3GSettings = parcel.readInt() == 1;
			screen3G = parcel.readParcelable(ScreenSettings.class.getClassLoader());
			performance3G = parcel.readParcelable(PerformanceFlags.class.getClassLoader());
			redirectSDCard = parcel.readInt() == 1;
			redirectSound = parcel.readInt();
			redirectMicrophone = parcel.readInt() == 1;
			security = parcel.readInt();
			consoleMode = parcel.readInt() == 1;
			remoteProgram = parcel.readString();
			workDir = parcel.readString();
		}

		private void init() {
			enable3GSettings = false;
			screen3G = new ScreenSettings();
			performance3G = new PerformanceFlags();
			redirectSDCard = false;
			redirectSound = 0;
			redirectMicrophone = false;
			security = 0;
			consoleMode = false;
			remoteProgram = "";
			workDir = "";
		}

		private void validate() {
			switch (redirectSound) {
				case 0:
				case 1:
				case 2:
					break;
				default:
					redirectSound = 0;
					break;
			}

			switch (security) {
				case 0:
				case 1:
				case 2:
				case 3:
					break;
				default:
					security = 0;
					break;
			}
		}

		public boolean getEnable3GSettings() {
			return enable3GSettings;
		}

		public void setEnable3GSettings(boolean enable3GSettings) {
			this.enable3GSettings = enable3GSettings;
		}

		public ScreenSettings getScreen3G() {
			return screen3G;
		}

		public void setScreen3G(ScreenSettings screen3G) {
			this.screen3G = screen3G;
		}

		public PerformanceFlags getPerformance3G() {
			return performance3G;
		}

		public void setPerformance3G(PerformanceFlags performance3G) {
			this.performance3G = performance3G;
		}

		public boolean getRedirectSDCard() {
			return redirectSDCard;
		}

		public void setRedirectSDCard(boolean redirectSDCard) {
			this.redirectSDCard = redirectSDCard;
		}

		public int getRedirectSound() {
			validate();
			return redirectSound;
		}

		public void setRedirectSound(int redirect) {
			this.redirectSound = redirect;
		}

		public boolean getRedirectMicrophone() {
			return redirectMicrophone;
		}

		public void setRedirectMicrophone(boolean redirect) {
			this.redirectMicrophone = redirect;
		}

		public int getSecurity() {
			validate();
			return security;
		}

		public void setSecurity(int security) {
			this.security = security;
		}

		public boolean getConsoleMode() {
			return consoleMode;
		}

		public void setConsoleMode(boolean consoleMode) {
			this.consoleMode = consoleMode;
		}

		public String getRemoteProgram() {
			return remoteProgram;
		}

		public void setRemoteProgram(String remoteProgram) {
			this.remoteProgram = remoteProgram;
		}

		public String getWorkDir() {
			return workDir;
		}

		public void setWorkDir(String workDir) {
			this.workDir = workDir;
		}

		@Override
		public int describeContents() {
			return 0;
		}

		@Override
		public void writeToParcel(Parcel out, int flags) {
			out.writeInt(enable3GSettings ? 1 : 0);
			out.writeParcelable(screen3G, flags);
			out.writeParcelable(performance3G, flags);
			out.writeInt(redirectSDCard ? 1 : 0);
			out.writeInt(redirectSound);
			out.writeInt(redirectMicrophone ? 1 : 0);
			out.writeInt(security);
			out.writeInt(consoleMode ? 1 : 0);
			out.writeString(remoteProgram);
			out.writeString(workDir);
		}
	}
}
